"""
线程同步，保证数据的安全，但是效率比较低

使用Thread对象的Lock和Rlock可以实现简单的线程同步，这两个对象都有acquire方法和release方法，
对于那些需要每次只允许一个线程操作的数据，可以将其操作放到acquire和release方法之间

lock = threading.Lock() #lock对象
lock.acquire() #获取锁
lock.release() #释放锁

锁的获取和释放需要注意死锁的问题
"""
import threading
import random
import time

lock = threading.Lock()
list1 = [0] * 10


def task1():
    # 获取线程锁，如果已经上锁，则阻塞等待锁的释放
    lock.acquire(timeout=5)  # 阻塞,超时会取消获取锁并且继续执行逻辑以便释放当前已经获取的锁
    for i in range(len(list1)):
        list1[i] = 1
        time.sleep(0.5)
    lock.release()


def task2():
    lock.acquire()
    for i in range(len(list1)):
        print("--------->", list1[i])
        time.sleep(0.5)
    lock.release()


if __name__ == '__main__':
    t1 = threading.Thread(target=task1)
    t2 = threading.Thread(target=task2)
    t1.start()
    t2.start()

    t1.join()
    t2.join()
    print(list1)
